package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectDemo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //1加载类对象
        Class cls = Class.forName("reflect.Person");
        /*
            Constructor类，反射对象之一
            该类的每一个实例用于反应一个类中某个指定的构造器
            通过构造器对象可以得知其表达的构造器的相关信息:
            访问修饰符，参数列表等
            并且可以通过该构造器实例化对象
         */
        //2通过类对象反应它表示的类的特定构造器
        Constructor c = cls.getConstructor();
        Object o = c.newInstance();
        System.out.println(o);

        /*
            通过类对象的getConstructor()获取特定构造器时，需要在参数部分传入该构造器的参数列表
            每个参数用对应的类对象即可。保证与实际构造器参数列表的顺序，个数，类型一致即可。
         */
        //Person(String,int)
        Constructor c2 = cls.getConstructor(String.class, int.class);
        //实例化时要传入实际参数
        Object o2 = c2.newInstance("李四",18);
        System.out.println(o2);

        //Person(String)
        Constructor c3 = cls.getConstructor(String.class);
        Object o3 = c3.newInstance("王五");
        System.out.println(o3);
    }
}
